﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Business.Entity.Estoque.Produto.ClassesRelacionadas;
using Business.Entity.Sped;
using Business.Enum;

namespace Business.Entity.Estoque.Produto
{
    /// <summary>
    /// Classe que define os dados para um produto. Deve-se atentar para o fato de que um produto marcado como filme
    /// somente poderá ser vendido por meio da tela de pedidos do sistema de retaguarda.
    /// </summary>
    [Serializable]
    public class Produto
    {
        public  const string ErrorRequired = "O campo {0} é obrigatório";
        public virtual int Id { get; set; }
        [Required(ErrorMessage = ErrorRequired)]
        [StringLength(50,MinimumLength = 5, ErrorMessage = "A descrição deve ter entre 5 e 50 caracteres.")]
        public virtual string Descricao { get; set; }
        public virtual string Referencia { get; set; }
        public virtual string CodBarra { get; set; }
        [Range(0.01F,99999,ErrorMessage = "O preço não deve ser maior que 0 e menor que 99999.")]
        public virtual Decimal PrecoVenda { get; set; }

        public virtual Decimal SaldoAtual
        {
            get
            {
                return 0;
            }
        }
        // Enumerações.
        [Required(ErrorMessage = "O campo IPPT é obrigatório")]
        public virtual IAT Iat { get; set; }
        [Required(ErrorMessage = ErrorRequired)]
        public virtual Ippt Ippt { get; set; }

        [Required(ErrorMessage = ErrorRequired)]
        public virtual SubGrupoProduto SubGrupo { get; set; }

        /// <summary>
        /// Define se é um produto, mercadoria ou serviço.
        /// </summary>
        public virtual TipoProduto Tipo { get; set; }

        /// <summary>
        /// Define se o produto final será obtido por receita.
        /// </summary>
        public virtual bool TemReceita { get; set; }

        /// <summary>
        /// Define qual é o subtipo do produto que será carregado. Se marcado como produto utiliza as informações
        /// contidas na classe produto e não em suas subclasses
        /// </summary>
        [Required(ErrorMessage = ErrorRequired)]
        public virtual SubTipoProduto SubTipo { get; set; }

        public virtual IList<Receita> Receitas { get; set; }

        public virtual DateTime UltimaCompra { get; set; }

        public virtual Decimal Custo
        {
            get
            {
                return 0;
            }
        }

        public virtual Decimal CustoMedio
        {
            get
            {
                return 0;
            }
        }


        public virtual Decimal Lucro
        {
            get
            {
                return 0;
            }
        }

        public virtual Decimal ValorPromocional { get; set; }
        public virtual Decimal SaldoMinimo { get; set; }
        [Required(ErrorMessage = ErrorRequired)]
        public virtual Ncm NCM { get; set; }

        [Required(ErrorMessage = ErrorRequired)]
        public virtual OrigemProduto Origem { get; set; }

        [Required(ErrorMessage = ErrorRequired)]
        public virtual Unidade UnidadeCompra { get; set; }
        [Required(ErrorMessage = ErrorRequired)]
        public virtual Unidade UnidadeVenda { get; set; }
        public Produto()
        {
            Receitas = new List<Receita>();
            //Detalhe = new DetalhesProduto();
            //Tributacao = new Tributacao();
        }
    }
}
